{% extends "base_with_sidebar.html" %}
{% load i18n %}
{% load static %}

{% block title %}
    {% trans '对象存储API使用说明' %}
{% endblock %}

{% block content %}
    <div class="container-fluid">
        <div class="text-center">
            <h3>对象存储API使用说明</h3>
            <p></p>
        </div>
        <hr>
        <div class="nav-list" id="security-nav-list">
            <p><strong>1.&nbsp; 身份认证方式</strong></p>

            <p>
                API访问需要身份认证，安全凭证是用于用户身份认证的凭证，iHarbor云对象存储服务支持多种安全认证方式，如BasicAuthentication身份认证,Session,Token,访问密钥。推荐使用访问密钥方式；</p>

            <p><strong>2.&nbsp;</strong><strong>Auth Token认证</strong></p>

            <p>Token密钥认证方式，使用简单，安全性相对较低，推荐内网使用，token的获取可以通过开放的API获取,或者去iHarbor站点通过浏览器端网页获取。
                每个用户同一时刻只有一个有效的token，token永久有效，没有有效期，刷新创建新token，旧token会失效，如果token泄露，请及时创建新的token，以防数据泄露丢失。</p>

            <p>Token应包含在Authorization HTTP标头中，密钥应以字符串文字“Token”为前缀，空格分隔两个字符串。 例如：<br>
                <code>Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b</code></p>



            <div class="card border-success nav-list-item" id="nav-list-token">
                <div class="card-header" data-toggle="collapse" data-target="#nav-list-token-body">
                    <i class="far fa-dot-circle"></i><span>身份认证token</span></div>
                <div class="card-body collapse show" id="nav-list-token-body">
                    <div class="">
                        <p>token密钥用于身份验证，token应包含在Authorization HTTP标头中，密钥应以字符串文字“Token”为前缀，空格分隔两个字符串。
                        <p class="text-info">例如：Authorization: Token
                            9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b</p></p>
                        <p>刷新创建新token，旧token会失效，如果token泄露，请及时创建新的token，以防数据泄露丢失。</p>
                        {% if token %}
                            <table class="table" id="token-table">
                                <tr class="bg-light">
                                    <th>{% trans '创建时间' %}</th>
                                    <th>Token</th>
                                    <th>{% trans '操作' %}</th>
                                </tr>
                                <tr>
                                    <th>{{ token.created | date:'Y-m-d H:i:s' }}</th>
                                    <th>
                                        <input type="password" class="col-sm-10" value="{{ token.key }}"
                                               style="border: 0px;outline:none;">
                                        <span class="btn btn-outline-info secret-key-display"><i
                                                class="fa fa-eye"></i></span>
                                    </th>
                                    <th><span class="btn btn-danger" id="btn-new-token"><i
                                            class="fa fa-sync"></i>{% trans '创建新Token' %}</span></th>
                                </tr>


                            </table>
                        {% else %}
                            <span class="btn btn-danger" id="btn-new-token"><i
                                    class="fa fa-sync"></i>{% trans '创建新Token' %}</span>
                        {% endif %}
                    </div>
                </div>
            </div>


            <p><strong>3. JWT认证</strong></p>

            <ul>
                <li>原生JWT认证</li>
            </ul>

            <p style="margin-left:40px">Json web token认证方式，使用简单，包括access jwt和refresh jwt，access
                jwt有效期为8h，旧的access jwt失效前可以通过对应API携带refresh jwt在有效时限（2天）内刷新获取新的access
                jwt。
                jwt应包含在Authorization HTTP标头中，密钥应以字符串文字“<code>Bearer</code>”为前缀，空格分隔两个字符串，例如：<br>
                <code>Authorization: Bearer eyJhbGciOiAiSFMyNTYiLCAidHlwIj</code></p>

            <ul>
                <li>科技云通行证JWT认证</li>
            </ul>

            <p style="margin-left:40px">jwt应包含在Authorization HTTP标头中，密钥应以字符串文字“AAI-JWT”为前缀，空格分隔两个字符串，例如：<br>
                <code>Authorization: AAI-JWT eyJhbGciOiAiSFMyNTYiLCAidHlwIj</code></p>

            <p><strong>4.&nbsp;访问密钥</strong></p>

            <p>访问密钥是一个密钥对（AccessKey和SecretKey），AccessKey会在网络中传输，SecretKey不在网络上传输，需要用户妥善保管。
                密钥对用于安全凭证的生成，通过一些签名算法，以SecretKey为加密参数，对一些适当的数据内容进行加密生成安全凭证。访问密钥认证方式安全性高，使用会复杂一些。<br>
                若SecretKey意外泄露或被恶意第三方窃取，可能导致数据泄漏风险。若发生密钥泄露等安全问题，密钥拥有着应第一时间在IHarbor平台
                的安全凭证中更换密钥。</p>

            <p>具体请参考<a href="http://obs.cstcloud.cn/docs/#/security" target="_blank">访问密钥使用方法</a>。</p>

            <div class="card border-danger nav-list-item" id="nav-list-auth-key">
                <div class="card-header" data-toggle="collapse" data-target="#nav-list-auth-key-body">
                    <i class="far fa-dot-circle"></i><span>{% trans '访问密钥对' %}</span></div>
                <div class="card-body collapse show" id="nav-list-auth-key-body">
                    <div class="">
                        <p>
                            每个访问密钥包含access_key和secret_key密钥对，访问密钥不只是简单的身份认证，每次http请求前都需要根据请求的url的path和有效期时间戳重新计算auth_key字符串，此认证方式安全性高，使用稍微复杂一些(具体生成过程请参考帮助文档)。
                            auth_key的格式为“evhb-auth {access_key}:{hmac_sha1}:{data_base64}”，应包含在Authorization
                            HTTP标头中，密钥应以字符串文字“evhb-auth”为前缀，空格分隔两个字符串。
                        <p class="text-info">例如：Authorization: evhb-auth xxx:xxx:xxx</p>
                        </p>
                        <table class="table table-hover" id="auth-key-table">
                            <tr class="bg-light">
                                <th>{% trans '创建时间' %}</th>
                                <th>{% trans '访问密钥' %}(access_key)</th>
                                <th>{% trans '秘密密钥' %}(secret_key)</th>
                                <th>{% trans '状态' %}</th>
                                <th>{% trans '操作' %}</th>
                            </tr>
                            {% if auth_keys %}
                                {% for key in auth_keys %}
                                    <tr>
                                        <td>{{ key.create_time | date:'Y-m-d H:i:s' }}</td>
                                        <td>{{ key.access_key }}</td>
                                        <td>
                                            <input title="{{ key.secret_key }}" class="secret-key" readonly
                                                   type="password" value="{{ key.secret_key }}"
                                                   style="border: 0px;outline:none;">
                                            <span class="btn btn-outline-info secret-key-display"><i
                                                    class="fa fa-eye"></i></span>
                                        </td>
                                        {% if key.state %}
                                            <td class="text-success">{% trans '使用中' %}</td>
                                        {% else %}
                                            <td class="text-warning">{% trans '停用' %}</td>
                                        {% endif %}
                                        <td>
                                            {% if key.state %}
                                                <span class="btn btn-info btn-stop-auth-key">{% trans '停用' %}</span>
                                            {% else %}
                                                <span class="btn btn-info btn-active-auth-key">{% trans '启用' %}</span>
                                            {% endif %}
                                            <span class="btn btn-danger btn-remove-auth-key"><i
                                                    class="fa fa-trash-alt"></i></span>
                                        </td>
                                    </tr>
                                {% endfor %}
                            {% endif %}
                        </table>
                        <span class="btn btn-primary" id="btn-create-auth-key"><i
                                class="fa fa-plus"></i>{% trans '创建新访问密钥' %}</span>
                    </div>
                </div>
            </div>

            <p><strong>5. Bucket Token</strong></p>

            <p>
                每个存储桶Bucket都可以创建2个存储桶自己的token（只有权限读写token对应的存储桶），token有2种访问权限，只读和可读可写；</p>

            <p>bucket token应包含在Authorization HTTP标头中，密钥应以字符串文字“BucketToken”为前缀，空格分隔两个字符串。
                例如：<br>
                <code>Authorization: </code>BucketToken<code> 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b</code></p>

            <p><strong>6. API研发文档与示例参考</strong></p>

            <p>API在线说明与测试文档：<a href="http://{{ host_url }}/apidocs/"> {{ host_url }}/apidocs/</a></p>

            <p><strong>API调用参考示例（Python）：</strong><a href="https://github.com/i-harbor/test" target="_blank">https://github.com/i-harbor/test</a>；
            </p>

            <p>为便于API的调用，我们提供了一个简单的Python包<a href="https://github.com/i-harbor/pyharbor"
                                                              target="_blank">pyharbor</a>；</p></div>

    </div>

{% endblock %}



{% block script_extends %}
    <script type="text/javascript" src="{% static 'art-template/template-web.js' %}"></script>
    <script type="text/javascript" src="{% static 'users/users.js' %}"></script>
{% endblock %}